/******************************************************************************
 * @file     spi.h
 * @brief    Bootloader中spi外设相关函数
 * @author   Ruilist
 * @date     2025-08-15
 * @version  V1.0.0
 * @copyright Copyright (c) 2025
 *
 * @note     1 tab = 4 space
 *
 * @par 日志:
 * - V1.0.0 2025-08-15 Ruilist
 *****************************************************************************/

#ifndef __SPI_H
#define __SPI_H

//******************************** Includes *********************************//

#include "main.h"
#include "stm32f4xx.h"

//******************************** Includes *********************************//

//******************************** Defines **********************************//

#define F_CS_Pin       GPIO_Pin_4
#define F_CS_GPIO_Port GPIOA

//******************************** Defines **********************************//

//******************************** Declaring ********************************//

/**
 * @brief   spi的cs接口初始化，CS PA4
 *
 * @param   void
 *
 * @return  void
 *
 */
void CS_IO_Init( void );

/**
 * @brief   spi的接口初始化
 *
 * @param   void
 *
 * @return  void
 *
 */
void SPI1_Init( void );

/**
 * @brief   spi的速度设置
 *
 * @param   uint8_t SPI_BaudRate_Prescaler
 *
 * @return  void
 *
 */
void SPI1_SetSpeed( uint8_t SPI_BaudRate_Prescaler );
/**
 * @brief   spi读写一个字节
 *
 * @param   uint8_t WriteData 写入的数据
 *
 * @return  uint8_t
 * @retval  byte 接收到的字节
 *
 */
uint8_t SPI1_ReadWriteByte( uint8_t WriteData );

/**
 * @brief   spi连续写入数据
 *
 * @param   uint8_t *WriteData 写入的数据的地址
 * @param   uint16_t dataSize  写入的数据的大小
 * @param   uint32_t timeout   超时时间
 *
 * @return  uint8_t
 * @retval  0 写入失败
 * @retval  1 写入成功
 *
 */
uint8_t SPI1_WriteByte( uint8_t *WriteData, uint16_t dataSize, uint32_t timeout );

/**
 * @brief   spi连续读出数据
 *
 * @param   uint8_t *WriteData 读出的数据的地址
 * @param   uint16_t dataSize  读出的数据的大小
 * @param   uint32_t timeout   超时时间
 *
 * @return  uint8_t
 * @retval  0 读出失败
 * @retval  1 读出成功
 *
 */
uint8_t SPI1_ReadByte( uint8_t *ReadData, uint16_t dataSize, uint32_t timeout );

//******************************** Declaring ********************************//

#endif /* __FLASH_H */
